package br.com.jk.cliente;

import br.com.jk.cidade.CidadeRn;
import br.com.jk.email.Email;
import br.com.jk.email.EmailJDialog;
import br.com.jk.email.EmailRn;
import br.com.jk.endereco.Endereco;
import br.com.jk.endereco.EnderecoRn;
import br.com.jk.telefone.Telefone;
import br.com.jk.telefone.TelefoneJDialog;
import br.com.jk.telefone.TelefoneRn;
import br.com.jk.util.Util;
import br.com.jk.util.pesquisa.Pesquisa;
import br.com.jk.util.pesquisa.Pesquisa.Tipo;
import br.com.jk.util.pesquisa.PesquisaJDialog;
import java.util.List;
import net.sf.jasperreports.engine.JRException;

/**
 *
 * @author camilo
 */
public class ClienteController {

  private ClienteJDialog dialog;
  private EmailJDialog emJDialog;
  private TelefoneJDialog telJDialog;
  private int colunaSel;
  private int idEnd;
  private boolean modoConsulta;
  private Pesquisa pesquisa = new Pesquisa();

  public ClienteController(ClienteJDialog fornJDialog) {
    this.dialog = fornJDialog;
  }

  /**
   * Verifica se todos os campos estão preenchidos, com excessão do campo jtfId
   *
   * @return
   */
  public boolean isNotNull() {
    if (dialog.getJtfCnpj().getText().isEmpty()) {
      Util.msgAdv("Campo \"CNPJ\" vazio.");
      dialog.getJtfCnpj().requestFocus();
      return false;
    } else if (dialog.getJtfIe().getText().isEmpty()) {
      Util.msgAdv("Campo \"IE\" vazio.");
      dialog.getJtfIe().requestFocus();
      return false;
    } else if (dialog.getJtfRazao().getText().isEmpty()) {
      Util.msgAdv("Campo \"Razão\" vazio.");
      dialog.getJtfRazao().requestFocus();
      return false;
    } else if (dialog.getJtfIdCidade().getText().isEmpty()) {
      Util.msgAdv("Campo \"Id Cidade\" vazio.");
      dialog.getJtfIdCidade().requestFocus();
      return false;
    } else if (dialog.getJtfCep().getText().isEmpty()) {
      Util.msgAdv("Campo \"CEP\" vazio.");
      dialog.getJtfCep().requestFocus();
      return false;
    } else if (dialog.getJtfRua().getText().isEmpty()) {
      Util.msgAdv("Campo \"Endereço\" vazio.");
      dialog.getJtfRua().requestFocus();
      return false;
    } else if (dialog.getJtfBairro().getText().isEmpty()) {
      Util.msgAdv("Campo \"Bairro\" vazio.");
      dialog.getJtfBairro().requestFocus();
      return false;
    } else if (dialog.getJtfNumero().getText().isEmpty()) {
      Util.msgAdv("Campo \"Nº\" vazio.");
      dialog.getJtfNumero().requestFocus();
      return false;
    } else if (dialog.getJtfFantasia().getText().isEmpty()) {
      Util.msgAdv("Campo \"Nome Fantasia\" vazio.");
      dialog.getJtfFantasia().requestFocus();
      return false;
    }
    return true;
  }

  public void selecionado() {
    int linhaSel = dialog.getJtFornecedor().getSelectedRow();//grava a linha selecionada

    if (linhaSel >= 0) { // executa o procedimento se o JTable não estiver vazio
      colunaSel = dialog.getJtFornecedor().getSelectedColumn(); //grava a coluna selecionada
      boolean pesq = setEnabledPesquisa(colunaSel); // Verifica as colunas que serão habilitadas para pesquisa
      dialog.getJtfId().setText(dialog.fornTm.getValueAt(linhaSel, ClienteTableModel.COLUNA_COD_ID).toString());
      dialog.getJtfFantasia().setText(dialog.fornTm.getValueAt(linhaSel, ClienteTableModel.COLUNA_COD_FANTASIA).toString());
      dialog.getJtfRazao().setText(dialog.fornTm.getValueAt(linhaSel, ClienteTableModel.COLUNA_COD_RAZAO).toString());
      dialog.getJtfCnpj().setText(dialog.fornTm.getValueAt(linhaSel, ClienteTableModel.COLUNA_COD_CNPJ).toString());
      dialog.getJtfIe().setText(dialog.fornTm.getValueAt(linhaSel, ClienteTableModel.COLUNA_COD_IE).toString());
      dialog.getJtfRua().setText(dialog.fornTm.getValueAt(linhaSel, ClienteTableModel.COLUNA_COD_RUA).toString());
      dialog.getJtfComplemento().setText(dialog.fornTm.getValueAt(linhaSel, ClienteTableModel.COLUNA_COD_COMPLEMENTO).toString());
      dialog.getJtfNumero().setText(dialog.fornTm.getValueAt(linhaSel, ClienteTableModel.COLUNA_COD_NUMERO).toString());
      dialog.getJtfBairro().setText(dialog.fornTm.getValueAt(linhaSel, ClienteTableModel.COLUNA_COD_BAIRRO).toString());
      dialog.getJtfCidade().setText(dialog.fornTm.getValueAt(linhaSel, ClienteTableModel.COLUNA_COD_CIDADE).toString());
      dialog.getJtfCep().setText(dialog.fornTm.getValueAt(linhaSel, ClienteTableModel.COLUNA_COD_CEP).toString());
      dialog.getJtaObs().setText(dialog.fornTm.getValueAt(linhaSel, ClienteTableModel.COLUNA_COD_OBSERVACAO).toString());
      dialog.getJtfIdCidade().setText(dialog.fornTm.getValueAt(linhaSel, ClienteTableModel.COLUNA_COD_ID_CIDADE).toString());
      dialog.getJcbPFisica().setSelected(Boolean.parseBoolean(
              dialog.fornTm.getValueAt(linhaSel, ClienteTableModel.COLUNA_COD_PFISICA).toString()));
      idEnd = Integer.parseInt(dialog.fornTm.getValueAt(linhaSel, ClienteTableModel.COLUNA_COD_ID_ENDERECO).toString());

      ClienteRn frn = new ClienteRn();
      Cliente f = frn.carregar(Integer.parseInt(dialog.getJtfId().getText()));
      setJtEmail(listarEmail(f));
      setJtTelefone(listarTelefone(f));

      modoConsulta = pesq;
      dialog.getJbBuscar().setEnabled(pesq);
    }

  }

  public Cliente criaFornecedor() {
    if (this.isNotNull()) {
      Cliente forn = new Cliente();

      //preenche o objeto com os dados dos jtextfield
      if (!dialog.getJtfId().getText().isEmpty()) {
        forn.setId(Integer.parseInt(dialog.getJtfId().getText()));
      }
      forn.setCnpj(dialog.getJtfCnpj().getText());
      forn.setIe(dialog.getJtfIe().getText());
      forn.setRazao(dialog.getJtfRazao().getText());
      forn.setFantasia(dialog.getJtfFantasia().getText());
      forn.setpFisica(dialog.getJcbPFisica().isSelected());

      Endereco e = new Endereco();
      if (idEnd > 0) {
        e.setId(idEnd);
      }
      e.setTipoEndereco(Endereco.ENDERECO_FORNECEDOR);
      e.setRua(dialog.getJtfRua().getText());
      e.setComplemento(dialog.getJtfComplemento().getText());
      e.setNumero(dialog.getJtfNumero().getText());
      e.setBairro(dialog.getJtfBairro().getText());
      e.setCep(Integer.parseInt(dialog.getJtfCep().getText()));
      e.setObservacao(dialog.getJtaObs().getText());

      CidadeRn crn = new CidadeRn();
      e.setCidade(crn.carregar(Integer.parseInt(dialog.getJtfIdCidade().getText())));
      forn.setEndereco(e);
      return forn;
    } else {
      return null;
    }
  }

  public void salvar() {
    Cliente forn = this.criaFornecedor();
    if (forn != null) {
      ClienteRn fornRn = new ClienteRn();
      EnderecoRn endRn = new EnderecoRn();

      //faz a conexão com o bd e salva os registros
      endRn.salvar(forn.getEndereco());
      fornRn.salvar(forn);

      listar();
      habilitaJb(true, false, false, false, false);
      habilitaJtf(false);
      dialog.getJbAddEmail().setEnabled(true);
      dialog.getJbAddTelefone().setEnabled(true);
      limpar();
    }
  }

  public void listar() {
    ClienteRn fornRn = new ClienteRn();
    setJtFornTM(fornRn.listar());
    limpar();
  }

  public List<Email> listarEmail(Cliente cliente) {
    EmailRn ern = new EmailRn();
    return ern.listarPorCliente(cliente);
  }

  public List<Telefone> listarTelefone(Cliente cliente) {
    TelefoneRn trn = new TelefoneRn();
    return trn.listarPorCliente(cliente);
  }

  public void excluir() {
    ClienteRn fornRn = new ClienteRn();
    Cliente forn = criaFornecedor();
    fornRn.excluir(forn);
    listar();
    limpar();
  }

  public void addItemEmail() {
    EmailJDialog.getInstance(null, true, Integer.parseInt(dialog.getJtfId().getText()), 
            Email.EMAIL_CLIENTE).setVisible(true);
    selecionado();
  }

  public void addItemTelefone() {
    TelefoneJDialog.getInstance(null, true, Integer.parseInt(dialog.getJtfId().getText()),
            Telefone.TELEFONE_CLIENTE).setVisible(true);
    selecionado();
  }

  public void setJtTelefone(List<Telefone> listaTel) {
    while (dialog.telTm.getRowCount() > 0) {
      dialog.telTm.remove(0);
    }
    if (!listaTel.isEmpty()) {
      dialog.telTm.adicionaLista(listaTel);
    }
  }

  public void setJtEmail(List<Email> lsEm) {
    while (dialog.emTm.getRowCount() > 0) {
      dialog.emTm.remove(0);
    }
    if (!lsEm.isEmpty()) {
      dialog.emTm.adicionaLista(lsEm);
    }
  }

  /**
   * Habilita a pesquisa somente para os campos configurados nesse método
   *
   * @param coluna Índice da coluna da qual se deseja efetuar a pesquisa
   * @return Se o campo estiver habilitado permite a pesquisa. O default é: false;
   */
  public boolean setEnabledPesquisa(int coluna) {
    colunaSel = coluna;
    switch (coluna) {
      case ClienteTableModel.COLUNA_COD_ID:
        pesquisa.setTipo(Pesquisa.Tipo.INTEGER);
        return true;
      case ClienteTableModel.COLUNA_COD_CNPJ:
        pesquisa.setTipo(Pesquisa.Tipo.STRING);
        return true;
      case ClienteTableModel.COLUNA_COD_IE:
        pesquisa.setTipo(Pesquisa.Tipo.STRING);
        return true;
      case ClienteTableModel.COLUNA_COD_CIDADE:
        pesquisa.setTipo(Pesquisa.Tipo.STRING);
        return false;
      case ClienteTableModel.COLUNA_COD_FANTASIA:
        pesquisa.setTipo(Pesquisa.Tipo.STRING);
        return true;
      case ClienteTableModel.COLUNA_COD_RAZAO:
        pesquisa.setTipo(Pesquisa.Tipo.STRING);
        return true;
      default:
        return false;
    }
  }

  public Pesquisa getCriterio(Tipo tipo) {
    return PesquisaJDialog.getCriterio(pesquisa.getTipo());
  }

  public void pesquisar() {
    Pesquisa pesq;
    if (modoConsulta) { //Se estiver habilitada a pesquisa executa o cod abaixo
      ClienteRn ctrn = new ClienteRn();

//        Verifica qual é o tipo de campo e executa a consulta específica
      switch (colunaSel) {
        case ClienteTableModel.COLUNA_COD_ID:
          pesq = getCriterio(pesquisa.getTipo());//abre a janela solicitando os dados ao usuário
          if (!pesq.isCancel()) {//se o retorno for positivo envia os dados para a jTable
            setJtFornTM(ctrn.pesquisaPadrao(Cliente.ATTRIBUTE_ID, Integer.parseInt(pesq.getCriterio()), pesq.getOpcao()));
          }
          break;
        case ClienteTableModel.COLUNA_COD_CNPJ:
          pesq = getCriterio(pesquisa.getTipo());//abre a janela solicitando os dados ao usuário
          if (!pesq.isCancel()) {//se o retorno for positivo envia os dados para a jTable
            setJtFornTM(ctrn.pesquisaPadrao(Cliente.ATTRIBUTE_CNPJ, pesq.getCriterio(), pesq.getOpcao()));
          }
          break;
        case ClienteTableModel.COLUNA_COD_IE:
          pesq = getCriterio(pesquisa.getTipo());//abre a janela solicitando os dados ao usuário
          if (!pesq.isCancel()) {//se o retorno for positivo envia os dados para a jTable
            setJtFornTM(ctrn.pesquisaPadrao(Cliente.ATTRIBUTE_IE,pesq.getCriterio(), pesq.getOpcao()));
          }
          break;
        /*case FornecedorTableModel.COLUNA_COD_CIDADE:
         pesq = getCriterio(pesquisa.getTipo());//abre a janela solicitando os dados ao usuário
         if (!pesq.isCancel()) {//se o retorno for positivo envia os dados para a jTable
         setJtFornTM(ctrn.pesquisaPadrao(Fornecedor.ATTRIBUTE_, pesq.getCriterio()));
         }
         break;*/
        case ClienteTableModel.COLUNA_COD_FANTASIA:
          pesq = getCriterio(pesquisa.getTipo());//abre a janela solicitando os dados ao usuário
          if (!pesq.isCancel()) {//se o retorno for positivo envia os dados para a jTable
            setJtFornTM(ctrn.pesquisaPadrao(Cliente.ATTRIBUTE_FANTASIA, pesq.getCriterio(), pesq.getOpcao()));
          }
          break;
        case ClienteTableModel.COLUNA_COD_RAZAO:
          pesq = getCriterio(pesquisa.getTipo());//abre a janela solicitando os dados ao usuário
          if (!pesq.isCancel()) {//se o retorno for positivo envia os dados para a jTable
            setJtFornTM(ctrn.pesquisaPadrao(Cliente.ATTRIBUTE_RAZAO, pesq.getCriterio(), pesq.getOpcao()));
          }
          break;
      }
      dialog.getJlFiltro().setVisible(true);
      dialog.getJbBuscar().setEnabled(false);
      limpar();
    }
  }

  public void setJtFornTM(List<Cliente> ct) {
    removeAllJtFornecedor();
    if (!ct.isEmpty()) {
      dialog.getFornTm().adicionaLista(ct);
    }
  }

  public void setJtFornTM(Cliente ct) {
    removeAllJtFornecedor();
    if (ct != null) {
      dialog.getFornTm().adiciona(ct);
    }
  }

  private void removeAllJtFornecedor() {
    while (dialog.getFornTm().getRowCount() > 0) {
      dialog.getFornTm().remove(0);
    }
  }

  public void novo() {
    limpar();
    habilitaJb(false, true, false, true, false);
    habilitaJtf(true);
    dialog.getJbAddEmail().setEnabled(false);
    dialog.getJbAddTelefone().setEnabled(false);
    dialog.getJtfFantasia().requestFocus();
  }

  public void limpar() {
    dialog.getJtaObs().setText(null);
    dialog.getJtfBairro().setText(null);
    dialog.getJtfCep().setText(null);
    dialog.getJtfCnpj().setText(null);
    dialog.getJtfId().setText(null);
    dialog.getJtfComplemento().setText(null);
    dialog.getJtfRua().setText(null);
    dialog.getJtfIe().setText(null);
    dialog.getJtfCidade().setText(null);
    dialog.getJtfNumero().setText(null);
    dialog.getJtfFantasia().setText(null);
    dialog.getJtfRazao().setText(null);
    dialog.getJtfId().setText(null);
    dialog.getJtfIdCidade().setText(null);
    dialog.getJcbPFisica().setSelected(false);
    dialog.getJbBuscar().setEnabled(false);
    idEnd = 0;


    while (dialog.getEmTm().getRowCount() > 0) {
      dialog.getEmTm().remove(0);
    }

    while (dialog.getTelTm().getRowCount() > 0) {
      dialog.getTelTm().remove(0);
    }
  }

  /**
   * Determina quais os botões da barra de ferramentas ficará ativo
   *
   * @param novo
   * @param salvar
   * @param editar
   * @param cancelar
   * @param excluir
   */
  public void habilitaJb(Boolean novo, Boolean salvar, Boolean editar, Boolean cancelar,
          Boolean excluir) {
    dialog.getJbNovo().setEnabled(novo);
    dialog.getJbSalvar().setEnabled(salvar);
    dialog.getJbEditar().setEnabled(editar);
    dialog.getJbCancelar().setEnabled(cancelar);
    dialog.getJbExcluir().setEnabled(excluir);
  }

  /**
   * Define se os JTextFields serão liberados para edição do usuário
   *
   * @param tf <b>True</b> - Habilitar; <b>False</b> - Desabilitar;
   */
  public void habilitaJtf(Boolean tf) {
    dialog.getJtaObs().setEnabled(tf);
    dialog.getJtfBairro().setEnabled(tf);
    dialog.getJtfCep().setEnabled(tf);
    dialog.getJtfCnpj().setEnabled(tf);
    dialog.getJtfComplemento().setEnabled(tf);
    dialog.getJtfRua().setEnabled(tf);
    dialog.getJtfIe().setEnabled(tf);
    dialog.getJtfCidade().setEnabled(tf);
    dialog.getJtfNumero().setEnabled(tf);
    dialog.getJtfFantasia().setEnabled(tf);
    dialog.getJtfRazao().setEnabled(tf);
    dialog.getJtfIdCidade().setEnabled(tf);
    dialog.getJcbPFisica().setEnabled(tf);
    dialog.getJtTelefone().setEnabled(!tf);
    dialog.getJtEmail().setEnabled(!tf);
  }

  public void editar() {
    habilitaJb(false, true, false, true, false);
    dialog.getJbAddEmail().setEnabled(false);
    dialog.getJbAddTelefone().setEnabled(false);
    habilitaJtf(true);
    dialog.getJtfFantasia().requestFocus();
  }

  public void cancelar() {
    limpar();
    habilitaJb(true, false, false, false, false);
    habilitaJtf(false);
    dialog.getJbAddEmail().setEnabled(true);
    dialog.getJbAddTelefone().setEnabled(true);
    if (modoConsulta) {
      modoConsulta = false;
    } else {
      listar();
    }
  }

  public void report() throws JRException, Exception {
    ClienteReport mReport = new ClienteReport();
    mReport.geraRelatorio();
//    Master.setTextJlStatus("");
//    Master.setJpbStatusIndeterminate(false);
  }
  
  public void selecionaRegistro(){
    int linhaSel = dialog.getJtFornecedor().getSelectedRow();
    dialog.getIdPesquisa().setText(dialog.getFornTm().getValueAt(linhaSel, 
            ClienteTableModel.COLUNA_COD_ID).toString());
    dialog.getRazaoPesquisa().setText(dialog.getFornTm().getValueAt(linhaSel, 
            ClienteTableModel.COLUNA_COD_RAZAO).toString());
    dialog.setModoConsultaExt(false);
    dialog.dispose();
  }
}